package br.com.vpsa.previdordevendas.model.service.impl;

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;
import javax.persistence.TypedQuery;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import br.com.vpsa.previdordevendas.model.entity.FaturamentoMensal;
import br.com.vpsa.previdordevendas.model.service.FaturamentoMensalService;
import br.com.vpsa.previdordevendas.model.util.CalendarUtils;

@Service
public class FaturamentoMensalServiceImpl implements FaturamentoMensalService 
{
    @PersistenceContext
    private EntityManager em;
    
	@Transactional
	public List<BigDecimal> listarFaturamento(String base, Long idEntidade, int ano) 
	{
		List<BigDecimal> valores = new ArrayList<BigDecimal>();
		
		List<FaturamentoMensal> faturamentosMensais = listarFaturamentosMensais(base, idEntidade, ano);
		
		for( int mes : CalendarUtils.meses )
		{
			FaturamentoMensal faturamentoMensal = FaturamentoMensal.find(faturamentosMensais, ano, mes);
			
			if( faturamentoMensal != null ){
				valores.add(faturamentoMensal.getValorTotal());
			} 
			else {
				valores.add(null);
			}
		}
		
		return valores;
	}    
    
	public List<FaturamentoMensal> listarFaturamentoDeAnosAnterioresParaUmMes( String base, Long idEntidade, int mes, int ano )
	{
		String hql = "select new br.com.vpsa.previdordevendas.model.entity.FaturamentoMensal(sum(f.valorTotal), f.ano) FROM FaturamentoMensal f " +
				 " where f.mes = :mes and f.base = :base and f.ano < :ano";
	
		if( idEntidade != null && idEntidade >= 0L ) {
			hql += " and f.idEntidade = :entidade";
		}
		
		
		hql += " group by f.ano order by f.ano asc";
		
		TypedQuery<FaturamentoMensal> query = em.createQuery(hql,FaturamentoMensal.class);
		query.setParameter("mes", mes);
		query.setParameter("base", base);
		query.setParameter("ano", ano);
		
		if( idEntidade != null && idEntidade >= 0L ) {
			query.setParameter("entidade",idEntidade);
		}
		
	   return query.getResultList();		 
	}
	
	@Override
	public List<FaturamentoMensal> listarFaturamentosMensais(String base, Long idEntidade, int ano)
	{
		String hql = "select new br.com.vpsa.previdordevendas.model.entity.FaturamentoMensal(p.ano, p.mes, sum(p.valorTotal)) FROM FaturamentoMensal p " +
				 " where p.ano = :ano and p.base = :base ";
	
		if( idEntidade != null && idEntidade >= 0L ) {
			hql += "and p.idEntidade = :entidade";
		}
		
		hql += " group by p.ano, p.mes order by p.mes";
		
		TypedQuery<FaturamentoMensal> query = em.createQuery(hql,FaturamentoMensal.class);
		query.setParameter("ano", ano);
		query.setParameter("base", base);
		
		if( idEntidade != null && idEntidade >= 0L ) {
			query.setParameter("entidade",idEntidade);
		}
		
	   return query.getResultList();		
	}

	@Override
	public List<FaturamentoMensal> listarFaturamentosMensais(String base, long idEntidade) 
	{
		String hql = "FROM FaturamentoMensal p where p.base = :base and p.idEntidade = :entidade order by p.ano, p.mes asc";
		
		TypedQuery<FaturamentoMensal> query = em.createQuery(hql,FaturamentoMensal.class);
		query.setParameter("base", base);
		query.setParameter("entidade",idEntidade);
		
	   return query.getResultList();		
	}

	@Override
	@Transactional
	public void apagarFaturamentosMensais(String base, Long idEntidade) 
	{
		String hql = "delete from FaturamentoMensal p where p.base = :base and p.idEntidade = :entidade";
		
		Query query = em.createQuery(hql);
		query.setParameter("base", base);
		query.setParameter("entidade",idEntidade);
		
		query.executeUpdate();
	}
}
